'use strict'
const path = require('path')
const defaultSettings = require('./src/settings.js')

function resolve(dir) {
  return path.join(__dirname, dir)
}

const name = defaultSettings.title || 'vue Admin Template' // page title

const port = process.env.port || process.env.npm_config_port || 9528 // dev port

module.exports = {
  publicPath: '/',
  outputDir: 'dist',
  assetsDir: 'static',
  lintOnSave: process.env.NODE_ENV === 'development',
  productionSourceMap: false,
  devServer: {
    port: port,
    // open: true,
    overlay: {
      warnings: false,
      errors: true
    },
    sockHost:'http://localhost',
    before: require('./mock/mock-server.js')
  },
  configureWebpack: {
    name: name, // 配置webpack环境变量 name
    resolve: {
      alias: {
        '@': resolve('src') // 别名
      }
    },
    // module: {
    //   rules: [
    //     {
    //       test: /\.gltf$/,
    //       include: [path.resolve(__dirname, 'src/assets')],
    //       use: [{
    //         loader: 'file-loader',
    //         options: {
    //           name: 'static/3dModel/[name].[hash:8].[ext]'
    //         }
    //       }]
    //     }
    //   ]
    // }
  },
  chainWebpack(config) {
    config.plugins.delete('preload') // 删除preload插件
    config.plugins.delete('prefetch') // 删除prefetch插件

    // set svg-sprite-loader
    config.module
      .rule('svg')  //默认规则
        .exclude
          .add(resolve('src/icons')) //排除文件夹
          .end() //回到上一级（svg规则）

    config.module
      .rule('icons') // 自定义规则名
        .test(/\.svg$/) // 正则匹配文件
        .include
          .add(resolve('src/icons')) // 指定文件夹
          .end() // 回到icons规则
        .use('svg-sprite-loader') //自定义use名
          .loader('svg-sprite-loader') //使用的loader
          .options({ // loader选项配置
            symbolId: 'icon-[name]'
          })
          .end() // 回到icons规则

    // 配置模型处理规则添加gltf格式
    config.module      // 对wenpack的module选项进行配置 
      .rule('3dModel') // 自定义规则名
        .test(/\.gltf$/) // 文件后缀
        .include         // 查找路径
          .add(resolve('src/assets')) // 使用resolve处理路径
          .end()
        .use('3dModel')   //自定义use名
          .loader('file-loader') //使用的loader
          .options({
            name: 'static/3dModel/[name].[hash:8].[ext]'
          })

    // set preserveWhitespace 后续版本去除了这个配置
    config.module
      .rule('vue') // vue规则
        .use('vue-loader') // use名
          .loader('vue-loader') // 使用的loader
          .tap(options => {
          options.compilerOptions.preserveWhitespace = true
            return options
          })
          .end()

    config
      .when(process.env.NODE_ENV === 'development', // 开发模式
        config => config.devtool('cheap-source-map') // 源码映射配置
      )

    config
      .when(process.env.NODE_ENV !== 'development', // 生产模式
        config => {
          config
            .plugin('ScriptExtHtmlWebpackPlugin') // 配置插件名
            .after('html')
            .use('script-ext-html-webpack-plugin', [{
            // 将runtimeChunk产生的runtime映射关系内联到index.html中 （组件懒加载｜运行时加载）
              inline: /runtime\..*\.js$/
            }])
            .end()
          config
            .optimization.splitChunks({ // 配置优化
              chunks: 'all',// 对所有的chunks执行
              cacheGroups: { // chunk分组、可以使用splitChunks的所有options
                libs: { // libs组（key是自定义的）
                  name: 'chunk-libs', // chunk组名（拼接到打包后的chunk中）
                  test: /[\\/]node_modules[\\/]/, // 内容所在位置
                  priority: 10, // 优先级
                  chunks: 'initial' // 只打包最初依赖的第三方 
                },
                elementUI: {
                  name: 'chunk-elementUI', // chunk组名（拼接到打包后的chunk中）
                  priority: 20, // 优先级要大于 libs and app or it will be packaged into libs or app
                  test: /[\\/]node_modules[\\/]_?element-ui(.*)/ // 内容所在位置
                },
                commons: {
                  name: 'chunk-commons', // chunk组名（拼接到打包后的chunk中）
                  test: resolve('src/components'), // 内容所在位置
                  minChunks: 3, //  minimum common number
                  priority: 5,
                  reuseExistingChunk: true // 复用现有的chunk
                }
              }
            })
          config.optimization.runtimeChunk('single') // 配置runtimeChunk （组件懒加载｜运行时加载）
        }
      )
  }
}
